iT邦幫忙

2023 iThome 鐵人賽

DAY 10
0
SideProject30

用 Rails 打造你的電商網站系列 第 10

Day 10 區分前台與後台

  • 分享至 

  • xImage
  •  

隨著功能越加越多,我們的專案也需要開始來區分前後台了

我們就簡單區分一下:

前台是給使用者看的
後台是給管理員看的

後台會用到的功能應該會比較多,所以我們就把後台區隔開來

區分後台

step 1. 修改路徑

因為前台是給使用者看的,前台的網址以簡單且能傳達意思為主,
所以原本的設定就保留給前台

後台我們需要再另外設定路徑

如果需要跟前台做區別,controller 就要不一樣,

以商品來說,我的 controller 也想要叫 drinks 與 desserts 啊,不然很難做區分耶

遇到這種狀況,我們可以在上一層加上 controller 來做區分,但路徑就必須要做調整

有幾個選項可以達成這個目標,namespacescope

來看一下 namespace 與 scope 的差別

namespace 不需要額外加 model 就可以達成我們要的目的,

而且也比較好閱讀(當然有可能會跟 coding style 有關,就照個人習慣選擇)

這邊我選擇用 namespace 來做

# config/routes.rb

Rails.application.routes.draw do
  devise_for :users
  resource :profiles
  resources :drinks
  resources :desserts

  namespace :admin do
    resources :drinks
    resources :desserts
  end
end

以 drinks 來說,就會做出以下的路徑

    admin_drinks GET    /admin/drinks(.:format)          admin/drinks#index
                 POST   /admin/drinks(.:format)          admin/drinks#create
 new_admin_drink GET    /admin/drinks/new(.:format)      admin/drinks#new
edit_admin_drink GET    /admin/drinks/:id/edit(.:format) admin/drinks#edit
     admin_drink GET    /admin/drinks/:id(.:format)      admin/drinks#show
                 PATCH  /admin/drinks/:id(.:format)      admin/drinks#update
                 PUT    /admin/drinks/:id(.:format)      admin/drinks#update
                 DELETE /admin/drinks/:id(.:format)      admin/drinks#destroy

step 2. 修改 controller

修改好路徑後,我們就要來修改 controller 了

基本上後面的都只是搬家作業而已

我們需要在 drinks 與 desserts controller 繼承 AdminController

不過為了方便管理,用一個資料夾來統整,這個資料夾我們就叫 admin

https://ithelp.ithome.com.tw/upload/images/20230925/20150947MNrw32LYEx.png

再來新增一個 admin controller ,可以把它想像成是後台的 application controller,所有的後台 controller 都繼承 admin controller 的設定

而 admin controller 則是繼承 application controller 的設定
(畢竟我們還是需要使用到 application controller 的方法)

最上層必須是 module Admin,這是 Rails 中的 Coc 規定,遵循這個慣例以便讓 Rails 輕鬆地找到檔案

module Admin
  class AdminController < ApplicationController
    include Pagy::Backend
  end
end

接下來就要設定 desserts controller 了

我們就直接把原本的 drinks_controller.rb 放置到 admin 底下,

並且讓它繼承 AdminController,

DessertsController 同理

module Admin
  class DrinksController < AdminController
    ...
  end
end
module Admin
  class DessertsController < AdminController
    ...
  end
end

接下來我們輸入路徑試試 127.0.0.1:3000/admin/drinks

這時候畫面應該會壞掉,因為他找不到對應的 view

step 3. 修改 View 檔案

我們只要做一個 admin 的資料夾,把原本的 drinks 及 desserts 資料夾放進去即可

https://ithelp.ithome.com.tw/upload/images/20230925/20150947MlFIKgAfto.png

重新整理畫面後,就恢復囉!

https://ithelp.ithome.com.tw/upload/images/20230925/20150947Aneb1KUJA1.png

這樣就輕鬆把後台搬移完成了

做出前台

接下來我們來做一下前台,前台應該會有個頁面包含全部的商品,個別的商品分類也會有自己的頁面

也就是說,應該會

包含所有商品的頁面 * 1
desserts 頁面 * 1
drinks 頁面 * 1

我們先來處理包含所有商品的頁面

新增路徑

由於我們只是要做出一頁,有包含所有商品的頁面

路徑就可以只包含 index

Rails.application.routes.draw do
  ...
  resources :products, only: [:index]
  ...
end

新增 Controller

接下來其實就是簡單的 CRUD 而已,因為我們的商品跟 Product 有 polymorphic 的關聯

我們可以直接撈所有的 Product 資料出來

class ProductsController < ApplicationController
  def index
    @pagy, @products = pagy(Product.all)
  end
end

新增 View

我們這時候就可以到 View 去把畫面渲染出來了

不過因為我們是用 polymorphic 的方式,所以需要每個資料需要用 productable 來把他們撈出來

<h2 class="mb-10 text-2xl">商品</h2>

<% @products.each do |product| %>
  <div class="w-2/4 p-4 mb-8 text-white border-2 rounded-lg bg-slate-500">
    <div class="flex items-center mb-4 field">
      <%= product.productable.name %>
    </div>
      
    <div class="flex items-center mb-4 field">
      <%= product.productable.description %>
    </div>
  
    <div class="flex items-center mb-4 field">
      <%= number_to_currency(product.productable.price, precious: 0) %>
    </div>
  </div>
<% end %>

<%== pagy_nav(@pagy) %>

這樣前台就完成囉!

drinks 跟 desserts 的頁面也是基本的 CRUD 就能完成,這邊交給大家去實作囉!


上一篇
Day 09 你看到的刪除不是刪除
下一篇
Day 11 茫茫商品中一鍵認出你
系列文
用 Rails 打造你的電商網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言